/**
 *
 * @description:decorators修饰器
 * @author: junyong.hong
 * @createTime: 2018/3/29
 * @version: 1.0.0.0
 * @history:
 *    1、
 *    2、
 *
 */
{
    // 是一个函数
    let readonly = function (target, name, descriptor) {
        descriptor.writable = false;
        return descriptor
    };

    // 修改类的行为
    class Test{
        // 加了修饰器，就是不能重新修改参数；只有只读的状态
        // @readonly与上面的readonly要一致
        @readonly
        time(){
            return '2017-03-11'
        }
    }

    let test = new Test();
    // 加了修饰器，就是不能重新修改参数；只有只读的状态
    // 报错
    // test.time = function () {
    //     console.log('reset name')
    // }
    // 2017-03-11
    console.log(test.time())
}


{
    let typename = function (target,name,descriptor) {
        // 静态属性
        target.myname = 'hello';
    };

    // 修饰器（对类进行修饰）
    @typename
    class Test{

    }
    console.log('类修饰符',Test.myname);    // hello
    // 第三方库修饰器的js库:core-decorators; npm install core-decorators
}

{
    // 看广告是show还是click
    let log = (type) => {
        return function (target,name,descriptor) {
            let src_method = descriptor.value;
            // 方法重新赋值
            descriptor.value=(...arg)=>{
                src_method.apply(target,arg);
                console.info(`log ${type}`);
            }
        }
    }

    class AD{
        @log('show')
        show(){
            console.info('ad is show');
        }

        @log('click')
        click(){
            console.info('ad is click');
        }

    }

    // 实例化
    let ad = new AD();
    ad.show();
    ad.click();
}